#include<iostream>
#include<type_traits>

using namespace std;
/* 一般形式 */
template<class c,class x,class y>
struct replace_type{
	typedef c type;
};
/*一阶形式*/
/*朴素形式*/
template<class x,class y>
struct replace_type<x, x, y>{
	typedef y type;
};
/*指针形式*/
template<class x,class y>
struct replace_type<x*, x, y> {
	typedef y* type;
};
/*引用形式*/
template<class x,class y>
struct replace_type<x&, x, y> {
	typedef y& type;
};
/*数组形式*/
template<class x,class y,size_t n>
struct replace_type<x[n], x, y> {
	typedef y type[n];
};
/*偏特化实现高阶形式的替换*/
/*对指针解指针*/
template<class c,class x,class y>
struct replace_type<c*, x, y> {
	typedef typename
		replace_type<c, x, y>::type* type;
};
/*对引用解引用*/
template<class c,class x,class y>
struct replace_type<c&, x, y> {
	typedef typename
		replace_type<c, x, y>& type;
};
/*对数组解数组*/
template<class c,class x,class y,size_t n>
struct replace_type <c[n],x,y>{
	typedef typename
		replace_type<c, x, y>::type type[n];
};
/*函数形式*/
/*无参数函数特化*/
template<class r,class x,class y>
struct replace_type <r(),x,y>{
	typedef typename
		replace_type<r, x, y>::type type();
};
/*有参数函数偏特化*/
template<class r,class x,class y,class... args>
struct replace_type <r(args...),x,y>{
	typedef typename
		replace_type<r, x, y>::type type(typename replace_type<args, x, y>::type...);
};
int main(void) {

	cout << is_same<replace_type<int(int, int), int, float>::type, float(float,float)>::value << endl;
	getchar();
	return 0;
}